////////////////////////////////////////////////////////////////////////////////
/// tototoy Code
/// $Id: xml_parser.cc 31 2009-09-30 10:05:21Z tonyjobmails $
/// $Date: 2009-09-30 10:05:21 +0000 (Wed, 30 Sep 2009) $
/// $Author: tonyjobmails $
/// $Revision: 31 $
/// E-mail: tonyjobmails@gmail.com
/// filename: xml_parser.cpp
/// function: xml解析类成员函数的定义 
////////////////////////////////////////////////////////////////////////////////

#include "xml_parser.h"

//////////////////////////////////////////////////////////////////////
/// 构造函数与析构函数定义
xml_parser::xml_parser()
{
}
xml_parser::xml_parser(const string &file_name)
{
	if(!file_name.empty())
	{
		/// 调用tinyXml的加载文件
		this->xml_config_file.LoadFile(file_name.c_str());
	}
}
xml_parser::xml_parser(const char* file_name)
{
	if(file_name)
	{
		this->xml_config_file.LoadFile(file_name);
	}
}
xml_parser::~xml_parser(){}
/// 构造函数与析构函数定义结束
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
/// 初始化将要解析文件
/// 检查返回值为true以后才能对xml_config_file进行操作
bool xml_parser::init_file(const string &file_name)
{
	if(!file_name.empty())
	{
		/// 调用tinyXml的加载文件
		if(this->xml_config_file.LoadFile(file_name.c_str()) == true)
			return true;
	}
	return false;
}
bool xml_parser::init_file(const char* file_name)
{
	if(file_name)
	{
		if(this->xml_config_file.LoadFile(file_name) == true)
			return true;
	}
	return false;
}
/// 初始化将要解析文件结束
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/// 得到根结点的元素
const tiny_xml_elem* xml_parser::get_root_node(const char *root_name)
{
	if(!root_name)
		return this->xml_config_file.RootElement();
	else
		return this->xml_config_file.FirstChildElement(root_name);
	return NULL;
}
/// 得到根结点的元素结束
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/// 得到下一个结点的元素
const tiny_xml_elem* xml_parser::get_next_node(const tiny_xml_elem *p_node, const char *next_name)
{
	if(p_node)
	{
		if(!next_name)
			return p_node->NextSiblingElement();
		else
			return p_node->NextSiblingElement(next_name);
	}
	return NULL;
}
/// 得到下一个结点的元素结束
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/// 得到子结点的元素
const tiny_xml_elem* xml_parser::get_child_node(const tiny_xml_elem *p_node, const char *child_name)
{
	if(p_node)
	{
		if(!child_name)
			return p_node->FirstChildElement();
		else
			return p_node->FirstChildElement(child_name);
	}
	return NULL;
}
/// 得到子结点的元素结束
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/// 得到结点的属性
const tiny_xml_attr* xml_parser::get_node_attribute(const tiny_xml_elem *p_node, const char *attribute_name)
{
	if(p_node)
	{
		if(!attribute_name)
			return p_node->FirstAttribute();
		else
			return p_node->getAttribute(attribute_name);
	}
	return NULL;
}
/// 得到结点的属性结束
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/// 得到结点的内容
const char* xml_parser::get_node_text(const tiny_xml_elem *p_node)
{
	if(p_node)
		return p_node->GetText();
	return NULL;
}
/// 得到结点的内容结束
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/// 得到结点的属性，转化为相应的类型
/// 转化为数字
bool xml_parser::get_node_attribute_num(const tiny_xml_elem *p_node, 
		void* value, const _uint_32 _size, const char *attribute_name)
{
	const tiny_xml_attr* p_attribute;
	if(p_node && (p_attribute = get_node_attribute(p_node, attribute_name)))
	{
		const char *tmp = NULL;
		tmp = p_attribute->Value();
		if(!tmp) return false;
		switch(_size)
		{
			case sizeof(_uint_8):
					*(_uint_8 *)value = (_uint_8)atoi(tmp);
					break;
			case sizeof(_uint_32):
					*(_uint_32 *)value = (_uint_32)atoi(tmp);
					break;
			case sizeof(_uint_64):
					*(_uint_64 *)value = (_uint_64)atoll(tmp);
					break;
			default:
				return false;
		}
		return true;
	}
	return false;
}
/// 转化为字符串
bool xml_parser::get_node_attribute_string(const tiny_xml_elem *p_node,
		void* value, const _uint_32 _size, const char *attribute_name)
{
	const tiny_xml_attr* p_attribute;
	if(p_node && (p_attribute = get_node_attribute(p_node, attribute_name)))
	{
		const char *tmp = NULL;
		tmp = p_attribute->Value();
		if(!tmp) return false;
		strncpy((char *)value, tmp, _size);
		return true;
	}
	return false;
}
/// 转化为时间
bool xml_parser::get_node_attribute_time(const tiny_xml_elem *p_node, 
							time_t &value, const char *attribute_name)
{
	const tiny_xml_attr* p_attribute;
	if(p_node && (p_attribute = get_node_attribute(p_node, attribute_name)))
	{
		const char *tmp = NULL;
		tmp = p_attribute->Value();
		if(tmp == NULL) return false;
		tm tv;
		if(strptime(tmp, "%Y-T%m-%d %H:%M:%S", &tv) == NULL)
			return false;
		value = mktime(&tv);
		return true;
	}
	return false;
}
/// 得到结点的属性，转化为相应的类型结束
/////////////////////////////////////////////////////////////////////
